from flask import get_flashed_messages, request, flash, render_template, redirect, url_for, session
from models.usuario import metadata, Usuario
from models.database import db_session
import sys

from models.faseManager import FaseManager
from models.estadoFaseManager import EstadoFaseManager
from models.proyectoManager import ProyectoManager
from models.itemManager import ItemManager

itemMgr= ItemManager()
faseMgr = FaseManager()
proyectoMgr = ProyectoManager()
estadofaseMgr = EstadoFaseManager()

"""
Clase que contiene los metodos relacionados con la gestion de usuarios del sistema
"""

def gestionarFases():
    """ Metodo encargado de la busqueda de la gestion de fases de un proyecto """
    filtro=""
    if request.method == "POST":
        idproyecto = request.form["idproyecto"]
        filtro = request.form["filtro"]
        fases = faseMgr.getFasesPorProyecto(idproyecto)
        proyecto = proyectoMgr.getProyecto(idproyecto)
        return render_template("gestionarFases.html",idproyecto = idproyecto, proyecto = proyecto, filtro = request.form["filtro"], fases = fases)
    if request.method == "GET":
        if session['idproyecto']:
            if request.args.getlist("filtro"):
                filtro = request.args.getlist("filtro")[0]
            idproyecto = session['idproyecto']
            fases = faseMgr.getFasesPorProyecto(idproyecto)
            proyecto = proyectoMgr.getProyecto(idproyecto)
            return render_template("gestionarFases.html", idproyecto = idproyecto, proyecto = proyecto, filtro = filtro, fases = fases)
        else:
            flash(u"Seleccionar un proyecto antes de realizar la operacion", "error")
            return redirect(url_for("configurarProyecto", action="gestionarFases"))
        
def inicializarFase():
    """ Metodo encargado de inicializar una fase en la base de datos """
    if request.method == "GET":
        idfase = request.args.getlist("idfase")[0]
        fase = faseMgr.getFase(idfase)
        idproyecto = request.args.getlist("idproyecto")[0]
        fases = faseMgr.getFasesPorProyecto(idproyecto)
        return render_template("inicializarFase.html", fases = fases, idproyecto = idproyecto, idfase = idfase, fase = fase, filtro = request.args.getlist("filtro")[0] )
    if request.method == "POST":
        idfase = request.form["idfase"]
        fase = faseMgr.getFase(idfase)
        estadofase = estadofaseMgr.getEstadoFase(2)
        if fase.estadofase.nombre == "pendiente":
            fase.estadofase = estadofase      
            faseMgr.guardarFase(fase)
        else:
            flash("La fase no puede ser inicializada")
        idproyecto = request.form["idproyecto"]
        mensajes = get_flashed_messages(with_categories= True)
        categoria, mensaje = mensajes[0]
        if categoria == "error":
            flash(mensaje, categoria)
        else:
            flash("Fase inicializada exitosamente");
        return redirect(url_for("gestionarFases", idproyecto=idproyecto, filtro = request.form["filtro"]))

def modificarFase():
    session = db_session()
# Ya controla que cuando una fase esta en un estado distinto de pendiente no se pueda modificar    
    """ Metodo encargado de modificar una fase de la base de datos """
    if request.method == "GET":
        idfase = request.args.getlist("idfase")[0]
        fase = faseMgr.getFase(idfase)
        idproyecto = request.args.getlist("idproyecto")[0]
        fases = faseMgr.getFasesPorProyecto(idproyecto)
        
        return render_template("modificarFase.html", fases = fases, idproyecto = idproyecto, idfase=idfase, fase = fase, filtro = request.args.getlist("filtro")[0] )
    if request.method == "POST":
        idfase = request.form["idfase"]
        fase = faseMgr.getFase(idfase)
        if fase.estadofase.nombre == "pendiente":
            fase.nombre = request.form["nombre"]
            fase.numero = request.form["numero"]
            fase.descripcion = request.form["descripcion"]        
            faseMgr.guardarFase(fase)
            mensajes = get_flashed_messages(with_categories= True)
            categoria, mensaje = mensajes[0]
            if categoria == "error":
                flash(mensaje, categoria)
            else:
                flash("Modificado exitosamente");
        else:
            flash("La fase no puede ser modificada","error")
        idproyecto = request.form["idproyecto"]
        return redirect(url_for("gestionarFases", idproyecto=idproyecto, filtro = request.form["filtro"]))

def abrirFase():
    """ Metodo encargado de abrir una fase de la base de datos """
# falta controlar que la fase solo pueda abrirse por solicitudes de cambio aprobadas    
    if request.method == "GET":
        idfase = request.args.getlist("idfase")[0]
        fase = faseMgr.getFase(idfase)
        idproyecto = request.args.getlist("idproyecto")[0]
        fases = faseMgr.getFasesPorProyecto(idproyecto)
        return render_template("abrirFase.html", fases = fases, idproyecto = idproyecto, idfase=idfase, fase = fase, filtro = request.args.getlist("filtro")[0] )
    if request.method == "POST":
        idfase = request.form["idfase"]
        fase = faseMgr.getFase(idfase)
        estadofase = estadofaseMgr.getEstadoFase(4)
        if fase.estadofase.nombre == "cerrada":
            fase.estadofase = estadofase            
            faseMgr.guardarFase(fase)
            mensajes = get_flashed_messages(with_categories= True)
            categoria, mensaje = mensajes[0]
            if categoria == "error":
                flash(mensaje, categoria)
            else:
                flash("Fase abierta exitosamente");
        else:
            flash("La fase no puede ser abierta")
        idproyecto = request.form["idproyecto"]
        return redirect(url_for("gestionarFases", idproyecto = idproyecto, filtro = request.form["filtro"]))

def consultarFase():
    """ Metodo encargado de consultar los datos de una fase """
    if request.method == "GET":
        idfase = request.args.getlist("idfase")[0]
        fase = faseMgr.getFase(idfase)
        idproyecto = request.args.getlist("idproyecto")[0]
        return render_template("consultarFase.html", idproyecto = idproyecto, fase = fase, filtro = request.args.getlist("filtro")[0])
    else:
        idproyecto = request.form["idproyecto"]
        return redirect(url_for("gestionarFases", idproyecto = idproyecto, filtro = request.form["filtro"]))

def cerrarFase():
    """ Metodo encargado de cerrar una fase de la base de datos """
    if request.method == "GET":
        idfase = request.args.getlist("idfase")[0]
        fase = faseMgr.getFase(idfase)
        idproyecto = request.args.getlist("idproyecto")[0]
        fases = faseMgr.getFasesPorProyecto(idproyecto)
        return render_template("cerrarFase.html", fases = fases, idproyecto = idproyecto, idfase=idfase, fase = fase, filtro = request.args.getlist("filtro")[0] )
    if request.method == "POST":
        idfase = request.form["idfase"]
        fase = faseMgr.getFase(idfase)
        hab = 0
#         items = fase.items
        items = fase.items
        for item in items:
            if item.estadoItem.idestadoitem != 4:
                hab = 1
        if hab == 0:
            estadofase = estadofaseMgr.getEstadoFase(3) #cerrada
            estadofasesgte = estadofaseMgr.getEstadoFase(2) #abierta
            fase.estadofase = estadofase
            numerofase = fase.numero + 1
            fasesgte = faseMgr.getFasePorNumero(numerofase, fase.proyecto.idproyecto)
            faseMgr.guardarFase(fase)
            if fasesgte:
                if fasesgte.idestadofase==1: #abre solo si esta pendiente
                    fasesgte.estadofase = estadofasesgte           
                    faseMgr.guardarFase(fasesgte)
                mensajes = get_flashed_messages(with_categories= True)
                categoria, mensaje = mensajes[0]
                if categoria == "error":
                    flash(mensaje, categoria)
                else:
                    flash("Fase cerrada exitosamente");
        else:
            flash("La fase no puede ser cerrada. Verifique que todos los items esten dentro de una linea base aprobada.")
        
        idproyecto = request.form["idproyecto"]
        return redirect(url_for("gestionarFases", idproyecto = idproyecto, filtro = request.form["filtro"]))       
 
